package com.hqyj.zss.realm;

import com.hqyj.zss.pojo.Customer;
import com.hqyj.zss.service.AdminService;
import com.hqyj.zss.service.CustomerService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashSet;
import java.util.Set;

/*
*   认证域
*   给shiro框架返回系统中用户的认证信息
*   给shiro框架返回系统用户的授权信息
*
*/

public class CustomerShiroRealm extends AuthorizingRealm {
    @Autowired
    private CustomerService customerService;
    @Autowired
    private AdminService adminService;

/**
     * 给shiro框架返回系统中待认证用户的认证信息
     * @param token 认证令牌
     * @return 待认证用户的认证信息
     * @throws AuthenticationException
     */

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
       //使用认证令牌获取待登录的用户名
        String username = (String) token.getPrincipal();
        //在我们系统中查询用户信息
       Customer customer = customerService.getOneByUserName(username);
        //如果用户不存在，返回异常
        if (customer == null){
            throw new UnknownAccountException(username+"不存在");
        }
        // 在shiro的会话域中共享用户信息，以便业务层使用
        Session session = SecurityUtils.getSubject().getSession();//获取当前用户shiro的session域
        session.setAttribute("loginUser",customer);

        //这里的user的password提供的是暗文密码，还得提供salt，提供的盐为用户的用户名
        //类型的转换
        ByteSource saltBytes = ByteSource.Util.bytes(customer.getC_username());
        //使用四个参数的构造方法
        SimpleAuthenticationInfo info =
                new SimpleAuthenticationInfo(username,customer.getC_password(),saltBytes,getName());

        System.out.println("获取认证信息");

        return info;
    }



/**
     *  给shiro框架返回系统中用户的授权信息
     * @param principals
     * @return 用户的授权信息*/


    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

        return null;
    }

}
